package org.lc.stk.service.baseInfo;

import java.util.List;

import org.lc.stk.model.baseInfo.Cengci;
import org.lc.stk.web.dto.cengci.CengciQuery;
import org.lc.stk.web.dto.cengci.CreateCengciRequest;
import org.lc.stk.web.dto.cengci.UpdateCengciRequest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

/**
 * 培养层次服务接口
 */
public interface CengciService {
    
    /**
     * 创建培养层次
     * @param request 创建请求
     * @return 创建的培养层次
     * @throws BusinessException 如果编码或名称已存在
     */
    Cengci create(CreateCengciRequest request);
    
    /**
     * 更新培养层次
     * @param request 更新请求
     * @return 更新后的培养层次
     * @throws BusinessException 如果培养层次不存在，或者编码/名称与其他记录重复
     */
    Cengci update(UpdateCengciRequest request);
    
    /**
     * 删除培养层次（逻辑删除）
     * @param id 培养层次ID
     * @throws BusinessException 如果培养层次不存在
     */
    void delete(Integer id);
    
    /**
     * 根据ID获取培养层次
     * @param id 培养层次ID
     * @return 培养层次信息
     * @throws BusinessException 如果培养层次不存在
     */
    Cengci getById(Integer id);
    
    /**
     * 根据编码获取培养层次
     * @param code 培养层次编码
     * @return 培养层次信息
     * @throws BusinessException 如果培养层次不存在
     */
    Cengci getByCode(String code);
    
    /**
     * 分页查询培养层次
     * @param query 查询条件
     * @param pageable 分页参数
     * @return 分页结果
     */
    Page<Cengci> query(CengciQuery query, Pageable pageable);
    
    /**
     * 获取所有未删除的培养层次
     * @return 培养层次列表
     */
    List<Cengci> listAll();
    
    /**
     * 检查编码是否已存在
     * @param code 编码
     * @param excludeId 排除的ID
     * @return true if exists
     */
    boolean isCodeExists(String code, Integer excludeId);
    
    /**
     * 检查名称是否已存在
     * @param name 名称
     * @param excludeId 排除的ID
     * @return true if exists
     */
    boolean isNameExists(String name, Integer excludeId);
}